//请求报错模块
var createError = require('http-errors');
// 引入express
var express = require('express');
// 引入path
var path = require('path');
//处理cookie
var cookieParser = require('cookie-parser');
//控制台打印请求
var logger = require('morgan');
// 引入express-session  登录用户信息验证
var session = require('express-session');
const mysql = require('mysql')
const MySQLStore = require('express-mysql-session')(session);

//配置mysql
const options = {
  host:'localhost',
  post:3306,
  user:'root',
  password:'123456',
  database:'session'
};
//创建session
const sessionStore = new MySQLStore(options);

// 路由文件
var indexRouter = require('./routes/index');   // 页面请求
var apiRouter = require('./routes/api');       // 页面逻辑

var app = express();

// view engine setup 模板引擎
// app.set('views', path.join(__dirname, 'views'));
// app.set('view engine', 'jade');

//更换模板引擎
app.engine('html', require('express-art-template'));
// app.set('views', {
//   debug: process.env.NODE_ENV !== 'production'
// });
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'html');

//打印中间件
app.use(logger('dev'));
//处理post请求中间件
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
//处理cookie中间件
app.use(cookieParser());
// 定义公共资源
app.use(express.static(path.join(__dirname, 'public')));

// 使用全局的中间件
// app.use((req,res,next)=>{
//   console.log("我是全家中间件，也可以理解成全局守卫");
//   next();
// })
/**
 * session
 *  secret：  一个 String 类型的字符串，作为服务器端生成 session 的签名
 *  name:    保存在本地cookie的一个名字 默认connect.sid  可以不设置
 *  resave:  强制保存 session 即使它并没有变化,。默认为 true。建议设置成 false。
 *  rolling: 在每次请求时强行设置 cookie，这将重置 cookie 过期时间（默认：false）
 *  saveUninitialized: 强制将未初始化的 session 存储。默认值是true,建议设置成true
 *
 * cookie
 *  属性默认值: { path: '/', httpOnly: true, secure: false, maxAge: null }
 *  httpOnly： 属性禁止客户端JavaScript的访问，禁止后不能使用document.cookie
 *  secure:    https这样的情况才可以访问cookie  http://localhost:9999/
 *  maxAge：   单位毫秒，从设置cookie开始多少毫秒失效(如果maxAge和expires都设置了，最后设置的属性生效.)
 *  path：     路径，默认值为域名的根路径 
 *  sameSite:  SameSite-cookies是一种机制，用于定义cookie如何跨域发送。
 */

// 配置session ，需要在路由之前
app.use(session({
  secret: 'hellom',
  name: 'hellom.sid',
  resave: true,
  rolling: true,
  saveUninitialized: true,
  cookie: {
      secure: false,
      // domain: 'xxx.xxx.xxx.xxx:xxxx', // 域名
      path: '/',
      httpOnly: true,
      maxAge: 1000*60*60
    },
    store:sessionStore,
}));


// 使用路由
app.use('/', indexRouter);
app.use('/api', apiRouter);


// catch 404 and forward to error handler
app.use(function(req, res, next) {
  res.render('404');
  // next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
